package com.hh.flow.facade;


import com.hh.flow.domain.FlowInstance;
import com.hh.flow.dto.FlowParams;

import java.util.List;

/**
 * @author minliuhua
 * @description: 工作流对外发布的唯一接口
 * @date: 2023/3/30 15:23
 */
public interface FlowManagerService {

    /**
     * 部署流程定义时使用
     * @throws Exception
     */
    void deployFlow() throws Exception;

    /**
     * 开启一个新的流程
     *
     * @param businessId 业务id
     * @param flowUser 用户信息
     * @return 流程当前状态
     */
    FlowInstance startFlow(String businessId, FlowParams flowUser);

    /**
     * 开启多个新的流程,默认使用发布的那个流程
     *
     * @param businessIds 业务id集合
     * @param flowUser 用户信息
     * @return 流程当前状态
     */
    List<FlowInstance> startFlow(List<String> businessIds, FlowParams flowUser);

    /**
     * 流程流转,根据conditionValue跳转到指定结点，
     *
     * @param definitionId         流程id
     * @param conditionValue 跳转条件 第一个结点条件可以为空
     * @param flowUser 用户信息
     * @return 流程流转后状态
     */
    FlowInstance skipFlow(Long definitionId, String conditionValue, FlowParams flowUser);

    /**
     * 流程流转,根据conditionValue跳转到指定结点 【附带跳转信息】
     *
     * @param definitionId         流程id
     * @param conditionValue 跳转条件 第一个结点条件可以为空
     * @param message 消息
     * @param flowUser 用户信息
     * @return 流程流转后状态
     */
    FlowInstance skipFlow(Long definitionId, String conditionValue, String message, FlowParams flowUser);


    /**
     * 批量流程跳转
     * 暂时只支持多条相同状态的流程做相同的跳转
     * 要不全部成功,要不全部失败,不存在某部分成功，部分不成功！
     * @param definitionIds         流程ids
     * @param conditionValue 跳转条件 第一个结点条件可以为空
     * @param flowUser 用户信息
     * @return 流程流转后状态
     */
    List<FlowInstance> skipFlow(List<Long> definitionIds, String conditionValue, FlowParams flowUser);

    /**
     * 批量流程跳转 【附带跳转信息】
     * 暂时只支持多条相同状态的流程做相同的跳转
     * 要不全部成功,要不全部失败,不存在某部分成功，部分不成功！
     *
     * @param definitionIds         流程ids
     * @param conditionValue 跳转条件 第一个结点条件可以为空
     * @param message 消息
     * @param flowUser 用户信息
     * @return 流程流转后状态
     */
    List<FlowInstance> skipFlow(List<Long> definitionIds, String conditionValue, String message, FlowParams flowUser);

}
